<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	function extend2(Child, Parent) {
		var p = Parent.prototype;
		var c = Child.prototype;
		for(var i in p){
			c[i] = p[i];
		}
		c.uber = p;
	}

	// 创建两个构造器函数，并在第一个构造器的原型中添加一些属性
	function Page() {};
	function Wee() {};
	Page.prototype.name = 'Bear';
	Page.prototype.owns = ['porridge', 'chair', 'bed'];

	// 让wee继承page
	extend2(Wee, Page);

	// 这里使用的是extend2()，即Wee的原型继承了Page的原型属性，并将其变成了自身属性
	console.log(Wee.prototype.hasOwnProperty('name'));
	console.log(Wee.prototype.hasOwnProperty('owns'));

	// 其中，name属于基本类型属性，创建的是一份全新的拷贝。而owns属性是一个数组对象，他所执行的是引用拷贝
	console.log(Wee.prototype.owns);
	console.log(Wee.prototype.owns === Page.prototype.owns);

	// 如果改变Wee中的name属性，不会对page产生影响
	console.log(Wee.prototype.name += ', Little Bear');
	console.log(Page.prototype.name);

	// 但如果改变的是Wee的owns属性，page就会受到影响了，因为这两个属性在内存中引用的是同一个数组
	console.log(Wee.prototype.owns.pop());
	console.log(Page.prototype.owns);

	// 当然，如果我们用另一个对象对wee的owns属性进行完全的重写（而不是修改现有属性），事情就完全不一样了。在这种情况下，Paga的owns属性会继续引用原有对象，而wee得owns属性则指向了新的对象。
	Wee.prototype.owns = ['empty bowl', 'broken chair'];
	Page.prototype.owns.push('bed');
	console.log(Page.prototype.owns);

	// 这里的主要思想是，当某些东西被创建为一个对象时，他么那就被储存在内存中的某个物理位置，相关的变量和属性就会指向这些位置。而当我们将一个新对象赋值给wee.prototype.owns时，就相当于告诉他，将指针移动到这个新对象上面来
</script>
</body>
</html>